import { openSync, readFileSync, writeFileSync, closeSync } from 'node:fs';
import { EOL } from 'node:os';

const header = ['APHU',
'APRU',
'APZU',
'ARMU',
'CARU',
'CAWU',
'CGSU',
'DNAU',
'EITU',
'EOLU',
'FRHU',
'FRLU',
'HLTU',
'HNKU',
'ICUU',
'ITLU',
'KDCU',
'KKTU',
'KNLU',
'LCRU',
'MAEU',
'MAGU',
'MCCU',
'MWCU',
'PCIU',
'QQIU',
'RXCU',
'SCMU',
'SLSU',
'SUZU',
'UEHU',
'UESU',
'WFHU',
'WWLU',
'XYLU',
'BISU',
'BSIU',
'CICU',
'CJXU',
'CNIU',
'CSLU',
'DEXU',
'DFCU',
'FLSU',
'FOHU',
'GAEU',
'GLDU',
'GVCU',
'HDMU',
'HJCU',
'HJMU',
'HMCU',
'HTXU',
'IAAU',
'IFBU',
'KBSU',
'KKIU',
'LESU',
'LLTU',
'LYGU',
'MRKU',
'MSFU',
'MSTU',
'NPTU',
'OCGU',
'PSXU',
'RXTU',
'SAXU',
'SFFU',
'SKLU',
'SLPU',
'SNCU',
'TEMU',
'TEXU',
'TRIU',
'UNXU',
'UXXU',
'ZCSU',
'AWTU',
'CHNU',
'CKFU',
'CRSU',
'CRXU',
'CYSU',
'DVRU',
'ESHU',
'FBCU',
'FONU',
'GIPU',
'GRDU',
'HLXU',
'HPCU',
'HPGU',
'HYCU',
'HYJU',
'IKSU',
'IMTU',
'INBU',
'INKU',
'JTAU',
'KMBU',
'KMTU',
'MMSU',
'MOEU',
'MOFU',
'MOLU',
'MZWU',
'NIDU',
'NYKU',
'PHLU',
'PRGU',
'RAWU',
'RBGU',
'SKHU',
'SKRU',
'SPEU',
'WIKU',
'WSCU',
'XAHU',
'YOLU',
'AXIU',
'CAIU',
'CHLU',
'COIU',
'CSNU',
'DSLU',
'EMCU',
'ESPU',
'FDCU',
'GHMU',
'GSIU',
'HDSC',
'HPMU',
'HYMU',
'LYCU',
'MOGU',
'MOTU',
'MSKU',
'MUVU',
'POCU',
'PONU',
'PRSU',
'SAHU',
'SCZU',
'SEKU',
'SVWU',
'TGBU',
'TOLU',
'TSTU',
'TTNU',
'UCLU',
'WBPU',
'WEDU',
'WLBU',
'ZGXU',
'BMOU',
'CCEU',
'CGRU',
'CHSU',
'CLHU',
'CMAU',
'CXDU',
'DFSU',
'EISU',
'GATU',
'GSTU',
'HHSU',
'IPXU',
'JOLU',
'JPGU',
'KSBU',
'LCGU',
'LGEU',
'LHTU',
'MLCU',
'MLDU',
'MOAU',
'MSCU',
'ONTU',
'ORJU',
'RJCU',
'SMGU',
'TBJU',
'TCKU',
'TDLU',
'TRHU',
'TWCU',
'UETU',
'UNIU',
'VEDU',
'XHCU',
'XINU',
'XXXU',
'YTLU',
'ZXJU',
'AMFU',
'CADU',
'CAXU',
'CCLU',
'CEIU',
'CGMU',
'CRFU',
'CZZU',
'DDDU',
'DRYU',
'FCIU',
'FSCU',
'FTNU',
'FWRU',
'IRNU',
'LHXU',
'MANU',
'MGTU',
'MYXU',
'NEXU',
'NPLU',
'NSSU',
'NTCU',
'NWRU',
'OVLU',
'REGU',
'RFCU',
'SEGU',
'SGCU',
'SGRU',
'SJYU',
'SRWU',
'SUDU',
'TCHU',
'TDRU',
'WNGU',
'XLNU',
'YYCU',
'ZONU',
'AKLU',
'APLU',
'APMU',
'ATLU',
'BHCU',
'CBHU',
'CPSU',
'CSVU',
'DCVU',
'DFOU',
'ECMU',
'GBLU',
'GRIU',
'HHXU',
'HJLU',
'KKFU',
'KNEU',
'MAXU',
'MEDU',
'MIGU',
'NIPU',
'OOLU',
'RGHU',
'SDCU',
'TCLU',
'TDTU',
'TGHU',
'THLU',
'TLLU',
'TRLU',
'TSLU',
'TTLU',
'TXGU',
'UACU',
'WCIU',
'WSDU',
'XHTU',
'YMLU',
'ZIMU',
'BNGU',
'CEOU',
'CLCU',
'CSKU',
'ETEU',
'FCGU',
'FESU',
'GESU',
'GVDU',
'HCIU',
'HRZU',
'JHBU',
'KLFU',
'LEAU',
'LHSU',
'MNBU',
'MORU',
'QBXU',
'RZDU',
'STXU',
'TCNU',
'TCTU',
'TISU',
'TWLU',
'WDFU',
'WHLU',
'WWWU',
'XXFU',
'YTMU',
'СICU',
];
/**
 * 生成指定范围内随机数
 * @param min 
 * @param max 
 * @returns 
 */
function randomRange(min: number, max: number) {
    return Math.floor(Math.random() * (max - min)) + min;
}
/**
 * 箱号检查
 * @param p 
 * @returns 
 */
export function checkCntrNo(p: string): boolean {
    const cntrNo = p.trim().toUpperCase();
    let j=1, jt=0, i_p1: number, i_p2:number, s_pp: string;
    // ^[A-Za-z]{4}[0-9]{7}$  正则
    if (!/^[A-Za-z]{4}[0-9]{7}$/.test(cntrNo)) {
        return false;
    }
    if (cntrNo.length === 11) {
        // 处理前10位
        for (let index = 0; index < 10; index++) {
            const element = cntrNo[index].toUpperCase();
            const eleAsc = element.charCodeAt(0);
            if (eleAsc > 64) {
                i_p1 = eleAsc - 55;
                if (i_p1 > 10) {
                    i_p1 += 1;
                }
                if (i_p1 > 21) {
                    i_p1 += 1;
                } 	
                if (i_p1 > 32) {
                    i_p1 += 1; 	
                }
            } else {
                i_p1 = Number.parseInt(element);
            }
            jt = jt + i_p1 * j;
            j = j * 2;
        }
        i_p1 = Number.parseInt(cntrNo.slice(-1));
        i_p2 = jt % 11;
        if (i_p2 == 10) {
            i_p2 = 0;
        }
    } else {
        return false;
    }
    if (i_p2 !== i_p1) {
        return false;
    } 
    return true;
}
/**
 * 生成箱号
 * @returns 
 */
function createCntrNo() {
    const hStr = header[randomRange(0, 302)];
    const cntrNo = hStr + randomRange(0,999999).toString().padStart(6,'0');
    let j=1, jt=0, i_p1: number, i_p2:number, s_pp: string;
    for (let index = 0; index < 10; index++) {
        const element = cntrNo[index].toUpperCase();
        const eleAsc = element.charCodeAt(0);
        if (eleAsc > 64) {
            i_p1 = eleAsc - 55;
            if (i_p1 > 10) {
                i_p1 += 1;
            }
            if (i_p1 > 21) {
                i_p1 += 1;
            } 	
            if (i_p1 > 32) {
                i_p1 += 1; 	
            }
        } else {
            i_p1 = Number.parseInt(element);
        }
        jt = jt + i_p1 * j;
        j = j * 2;
    }
    // i_p1 = Number.parseInt(cntrNo.slice(-1));
    i_p2 = jt % 11;
    if (i_p2 == 10) {
        i_p2 = 0;
    }
    return cntrNo + i_p2;
}
async function main() {
    try {
        const filehandle = await openSync('10.txt', 'w+');
        for (let index = 0; index < 100; index++) {        
            const newCntrNo = createCntrNo();
            await writeFileSync(filehandle, `${newCntrNo}${EOL}`);
        }
        closeSync(filehandle);
    }catch(error) {
        console.log(error);
    }
}
// main();
